
import java.awt.*;
import java.awt.event.*;
import java.util.*;

/**
 * <p>
 * Representacao de um conjunto de instancias de BotaoDeRequisicao
 * instaladas em um andar especifico. Cada conjunto contem dois botoes
 * (exceto o primeiro e o ultimo andar): um para o passageiro poder indicar
 * a sua intencao de descer e o outro a sua intencao de descer.
 * </p>
 */
class ArranjoBotaoExternoAndar {

  ///////////////////////////////////////
  // attributes


/**
 * <p>
 * Representa o andar em que se encontram instalados os Botoes
 * representados.
 * </p>
 * 
 */
    private int andar; 

/**
 * <p>
 * Representa o BotaoDeRequisicao indicador da intencao de subir
 * </p>
 * 
 */
    private Checkbox subida; 

/**
 * <p>
 * Representa o BotaoDeRequisicao indicador da intencao de descer.
 * </p>
 * 
 */
    private Checkbox descida; 

/**
 * <p>
 * Representa o agrupamento de elementos graficos que representam as duas
 * instancias de BotaoDeRequisicao instaladas no andar (exceto no primeiro
 * e no ultimo andar).
 * </p>
 * 
 */
    private Panel panel; 

   ///////////////////////////////////////
   // associations

/**
 * <p>
 * Interface que agrega o agrupamento de elementos graficos que representam
 * os botoes de requisicao (aqueles instalados no andar).
 * </p>
 * 
 */
    private InterfaceDeUsuarioSimples interfaceDeUsuarioSimples; 


  ///////////////////////////////////////
  // operations


/**
 * <p>
 * Gera um instancia de ArranjoBotaoExternoAndar.
 * </p>
 * 
 * @param interfaceDeUsuario - Interface de usuario 'a qual e' agregada a
 * instancia.
 * 
 * @return uma instancia de ArranjoBotaoExternoAndar.
 * 
 * @param interfaceDeUsuarioSimples 
 * @param andar - andar em que se encontram instalados os Botoes.
 * 
 * @param numAndares - numero de andares do predio. Informacao utilizada
 * aqui para determinar o ultimo andar que so' tem um BotaoDeRequisicao.
 */
    public  ArranjoBotaoExternoAndar(InterfaceDeUsuarioSimples interfaceDeUsuarioSimples, int andar, int numAndares) {        
        GridLayout gridPanel, gridBotoes;
        Label indicadorAndar;
        Panel botoes;
        this.interfaceDeUsuarioSimples = interfaceDeUsuarioSimples;
        this.andar = andar;
        gridPanel = new GridLayout(1, 2, 0, 1);
        panel = new Panel(gridPanel);
        indicadorAndar = new Label(Integer.toString(andar), Label.RIGHT);
        panel.add(indicadorAndar);
        gridBotoes = new GridLayout(2, 1);
        botoes = new Panel(gridBotoes);
        if (andar < numAndares) {
            subida = new Checkbox("/\\");
            subida.addItemListener(new ComandoBotaoDeRequisicao(this, subida, true));
            botoes.add(subida);
        } else botoes.add(new Label(" "));
        if (andar > 1) {
            descida = new Checkbox("\\/");
            descida.addItemListener(new ComandoBotaoDeRequisicao(this, descida, false));
            botoes.add(descida);
        } else botoes.add(new Label(" "));
        panel.add(botoes);
    } // end ArranjoBotaoExternoAndar        

/**
 * <p>
 * Recebe a informacao de que a representacao de um dos botoes do conjunto
 * foi acionado.
 * </p>
 * 
 * @param subir - indica a intencao de movimento representado pelo Botao
 * acionado.
 */
    public void registrarAcionamento(boolean subir) {        
        interfaceDeUsuarioSimples.registrarAcionamentoBotaoDeRequisicao(andar, subir);
    } // end registrarAcionamento        

/**
 * <p>
 * Recebe uma solicitacao de alterar a representacao de um dos botoes do
 * conjunto para informar ao usuario de que ele foi armado.
 * </p>
 * 
 * @param subir - indica a intencao de movimento representado pelo Botao
 * armado.
 */
    public void armarBotaoDeRequisicao(boolean subir) {        
        if (subir) subida.setState(true);
        else descida.setState(true);
    } // end armarBotaoDeRequisicao        

/**
 * <p>
 * Recebe uma solicitacao de alterar a representacao de um dos botoes do
 * conjunto para informar ao usuario de que ele foi desarmado.
 * </p>
 * 
 * @param subir - indica a intencao de movimento representado pelo Botao
 * desarmado.
 */
    public void desarmarBotaoDeRequisicao(boolean subir) {        
        if (subir) 
        	subida.setState(false);
        else 
        	descida.setState(false);
    } // end desarmarBotaoDeRequisicao        

/**
 * <p>
 * Retorna o agrupamento (Panel) de representacoes graficas das duas
 * instancias de BotaoDeRequisicao.
 * </p>
 *
 * @return uma instancia de Panel.
 */
    public Panel getPanel() {        
        return panel;
    } // end getPanel        

 } // end ArranjoBotaoExternoAndar



